package com.pet.platform.service.impl;

import com.pet.platform.dto.CartItemDTO;
import com.pet.platform.entity.CartItem;
import com.pet.platform.entity.Product;
import com.pet.platform.exception.BusinessException;
import com.pet.platform.mapper.CartItemMapper;
import com.pet.platform.mapper.ProductMapper;
import com.pet.platform.service.CartService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class CartServiceImpl implements CartService {
    private final CartItemMapper cartItemMapper;
    private final ProductMapper productMapper;

    @Override
    public List<CartItemDTO> getCartItems(Long userId) {
        List<CartItem> cartItems = cartItemMapper.findByUserId(userId);
        return cartItems.stream().map(this::convertToDTO).collect(Collectors.toList());
    }

    @Override
    @Transactional
    public void addToCart(Long userId, Long productId, Integer quantity) {
        // 检查商品是否存在
        Product product = productMapper.findById(productId)
                .orElseThrow(() -> new BusinessException("商品不存在"));

        // 检查商品库存
        if (product.getStock() < quantity) {
            throw new BusinessException("商品库存不足");
        }

        // 检查购物车是否已存在该商品
        CartItem existingItem = cartItemMapper.findByUserIdAndProductId(userId, productId);
        if (existingItem != null) {
            // 更新数量
            existingItem.setQuantity(existingItem.getQuantity() + quantity);
            cartItemMapper.update(existingItem);
        } else {
            // 新增购物车项
            CartItem cartItem = new CartItem();
            cartItem.setUserId(userId);
            cartItem.setProductId(productId);
            cartItem.setQuantity(quantity);
            cartItemMapper.insert(cartItem);
        }
    }

    @Override
    @Transactional
    public void updateQuantity(Long userId, Long cartItemId, Integer quantity) {
        CartItem cartItem = cartItemMapper.findByUserId(userId).stream()
                .filter(item -> item.getId().equals(cartItemId))
                .findFirst()
                .orElseThrow(() -> new BusinessException("购物车项不存在"));

        // 检查商品库存
        Product product = productMapper.findById(cartItem.getProductId())
                .orElseThrow(() -> new BusinessException("商品不存在"));
        if (product.getStock() < quantity) {
            throw new BusinessException("商品库存不足");
        }

        cartItem.setQuantity(quantity);
        cartItemMapper.update(cartItem);
    }

    @Override
    @Transactional
    public void removeFromCart(Long userId, Long cartItemId) {
        CartItem cartItem = cartItemMapper.findByUserId(userId).stream()
                .filter(item -> item.getId().equals(cartItemId))
                .findFirst()
                .orElseThrow(() -> new BusinessException("购物车项不存在"));

        cartItemMapper.delete(cartItemId);
    }

    @Override
    @Transactional
    public void clearCart(Long userId) {
        cartItemMapper.deleteByUserId(userId);
    }

    private CartItemDTO convertToDTO(CartItem cartItem) {
        CartItemDTO dto = new CartItemDTO();
        dto.setId(cartItem.getId());
        dto.setUserId(cartItem.getUserId());
        dto.setProductId(cartItem.getProductId());
        dto.setQuantity(cartItem.getQuantity());
        
        if (cartItem.getProduct() != null) {
            dto.setProductName(cartItem.getProduct().getName());
            dto.setProductImage(cartItem.getProduct().getImageUrl());
            dto.setPrice(cartItem.getProduct().getPrice());
            dto.setTotalPrice(cartItem.getProduct().getPrice().multiply(new java.math.BigDecimal(cartItem.getQuantity())));
        }
        
        return dto;
    }
} 